/**
 * 一、基于以下代码完成下面四个练习
 * in_stock 库存
 * horsepower 马力
 * dollar_value 价格
 */
const fp = require('lodash/fp')
const _ = require('lodash')
const cars = [
    { name: 'Ferrari Ff', horsepower: 660, dollar_value: 700000, in_stock: true },
    { name: 'Spyker C12 Zagato', horsepower: 400, dollar_value: 114200, in_stock: true },
    { name: 'Jahuar XKR-S', horsepower: 500, dollar_value: 4200, in_stock: false },
    { name: 'Audi R8', horsepower: 525, dollar_value: 166200, in_stock: true },
    { name: 'Aston Martin One-77', horsepower: 750, dollar_value: 1850000, in_stock: true },
    { name: 'Pagani Huayra', horsepower: 760, dollar_value: 1300000, in_stock: false },
]

/**
 * 使用组合函数fp.flowRight() 实现下面的函数
 * 获取数组中最后一条数据的in_stock属性
let isLastInStock = function (cars) {
    let last_car = fp.last(cars)
    return fp.prop('in_stock',last_car)
}

/**练习1
 * flowRight参数执行顺序是从右向左的
 * 1.获取最后一条,放到右边
 * 2.获取in_stock属性  后执行，所以放到左边
 */
function lastCar (cars) {
    return fp.last(cars)
}
function inStock (obj) {
    return obj.in_stock
}
var result = fp.flowRight([inStock, lastCar])
console.log('1.获取最后一条的in_stock属性', result(cars));

/**练习2
 * 用fp.flowRight() 获取第一个car的name
 */
var first_name_flowRight = fp.flowRight(fp.prop('name'), fp.first)
console.log('2.flowRight', first_name_flowRight(cars));

/**练习3
 * 使用帮助函数 _average 重构averageDollarValue,使用函数组合实现
 * let averageDollarValue = function (cars) {
    let dollar_values = fp.map(function (car) {
        return car.dollar_value
    }, cars)
    return _average(dollar_values)
}
 * 组合函数就是两个纯函数组合返回一个新的函数
 * 一个循环获取价格的函数
 * 一个_average辅助函数  他们俩组合 是组合函数吗
 */
const log = (c) => {
    return console.log('打印日志', c)
}
let _average = function (xs) {
    return fp.reduce(fp.add, 0, xs) / xs.length
}
const map = _.curry((fn, cars) => _.map(cars, fn))
const get_dollar_array = _.flowRight(_average, map(fp.prop('dollar_value')))
console.log(get_dollar_array(cars))

/**
 * 练习4
 * 使用flowRight写一个sanitizeNames()函数
 * 返回一个下划线链接的小写字符串，把数组中的name转换成
 * 这种形式
 * sanitizeNames(["Hello World"])=>["hello_word"]
 * 思路：先获取数据中的name，在通过toLower小写，然后加入下划线
 * 得到组合函数sanitizeNames
 */
const map_name = _.curry((fn_name,arr)=>_.map(arr,fn_name))
const _underscore = fp.replace(/\W+/g, '_')
const sanitizeNames = _.flowRight(map_name(_underscore),map_name(_.toLower),map_name(fp.prop('name')))

console.log(sanitizeNames(cars));

